#include <stdio.h>
/*位运算符     本质上移动的二进制数的位操作
<<  左移
>>  右移
|   按位或
&   按位与
^   按位异或
~   取反   
*/

int main(void)
{
    char a = 127;//0111 1111
    printf("a=%d\n",a);
    a<<=1;//1111 1110(补码存放) 认为这是一个负数 得到源码 当前数据取反+1
        //  1000 0001  +1 》1000 0010 》十进制-2
    printf("a=%d\n",a);

    //按位与
    a=127;//0111 1111
    a=a&1;//0000 0001   相同位上 同时为1则为1 否则为0
    printf("a&1=%d\n",a);

    //按位或
    a=127;// 0111 1111
    a=a|10;//0000 1010   相同位上 有1则为1 否则为0
    printf("a|10=%d\n",a);

    //按位异或
    a=127;// 0111 1111
    a=a^10;//0000 1010   相同位上 同时为0 不同为1
    printf("a^10=%d\n",a);

    //按位取反    单目运算符  位上为1则变0  为0则变为1
    a=127;
    a=~a;//因为规定这个-128的补码就是这个数
    printf("~a=%d\n",a);
    return 0;
}

//算术运算符  自增自减运算符 以及优先级
int zizengzijian(void)
{
    int a=10;
    printf("%d,%d\n",++a,a++);
    printf("a=%d\n",a);
    a=10;
    int b = 2;
    printf("%d,%d,%d\n",a+b,a++,--a);//在printf函数输出列表时，结合性从右到左，输出是从左到右，如果a在前面会先输出，如果a在后面会等整个运算结束输出a的值
    a=10;
    printf("%d,%d\n",a-b,a++);
    return 0;
}